package com.jdd.fintech.morse.plugin.strategy;

import com.alibaba.fastjson.JSONObject;
import com.jdd.fintech.morse.plugin.ecrypts.SymmetricCrypto;
import com.jdd.fintech.morse.plugin.plugconfig.MorsePlugValueConfig;
import com.jdd.fintech.morse.plugin.strategy.context.AbstractDataEncryptAndDecryptStrategy;
import com.jdd.fintech.morse.plugin.util.CommonMethodUtils;
import com.jdd.fintech.morse.plugin.util.JsonStringUtils;
import com.jddglobal.filter.support.exception.FilterException;
import org.apache.commons.lang3.StringUtils;

import static com.jdd.fintech.morse.plugin.constans.OpenApiConstans.*;

/**
 * @description: 平安惠普数据加密策略类
 * @credit: 2021-12-24 11:05
 * @author: fengcheng
 **/
public class PahpDataEncryptAndDecryptStrategy extends AbstractDataEncryptAndDecryptStrategy {

    /**
     * 数据加密策略接口方法(平安惠普使用)
     * @param plugValueConfig   插件值对象
     * @param jsonObject        请求对象
     * @param scObj             算法对象
     * @return
     * @throws FilterException 方法
     */
    @Override
    public String dataEncryptsStrategyMethod(MorsePlugValueConfig plugValueConfig, JSONObject jsonObject, SymmetricCrypto scObj) {
        log.info("PahpDataEncryptAndDecryptStrategy.buildCommonRequestObjMethod.平安惠普的加密操作与金条使用同一种逻辑，故此处不做处理！");
        return null;
    }

    /**
     * 数据解密策略接口方法(平安惠普使用)
     * @param plugValueConfig   插件值对象
     * @param jsonObject        请求对象
     * @param scObj             算法对象
     * @return
     * @throws FilterException EncryptionAndDecryption
     */
    @Override
    public String dataDecryptsStrategyMethod(MorsePlugValueConfig plugValueConfig, JSONObject jsonObject, SymmetricCrypto scObj) {
        log.info("PahpDataEncryptAndDecryptStrategy.dataDecryptsStrategyMethod.平安惠普的解密操作与金条使用同一种逻辑，故此处不做处理！");
        return null;
    }

    /**
     * 构建公共请求对象(平安惠普使用)
     * @param plugValueConfig       插件值对象
     * @param tenantId              租户ID
     * @param productCode           产品编号
     * @param jsonObject            响应对象
     * @return
     */
    @Override
    public String buildCommonRequestObjMethod(MorsePlugValueConfig plugValueConfig, String tenantId, String productCode, JSONObject jsonObject) throws FilterException {
        log.info("PahpDataEncryptAndDecryptStrategy.buildCommonRequestObjMethod.平安惠普---构建响应数据======>开始");
        String interfaceRequestDirection = CommonMethodUtils.getMessageBizDateKey(plugValueConfig);
        //判断是否是JSON,如果不是直接返回原始json字符串
        if(!JsonStringUtils.judgeIsJson(interfaceRequestDirection, jsonObject)){
            return jsonObject.toJSONString();
        }
        try {
            //构建响应数据(平安惠普返回的数据结构符合文档规定好的响应数据结构，故不需要进行重新构建)
            String infoContent = jsonObject.getString(PA_DATA_CONTENT_KEY);
            JSONObject infoContentJson = JSONObject.parseObject(infoContent);
            infoContentJson.put(TENANTID, tenantId);
            infoContentJson.put(ORGCODE, null);
            String extendParameter = plugValueConfig.getExtendParameter();
            if(StringUtils.isNotBlank(extendParameter)){
                JSONObject extendParameterJson = JSONObject.parseObject(extendParameter);
                infoContentJson.put(ORGCODE, extendParameterJson.getString(COMPANYID));
            }
            // TODO 以下代码为参数扩展字段，现阶段不需要通过扩展字段传输“机构ID”
            /*
            String extendParameter = plugValueConfig.getExtendParameter();
            JSONObject extendParJson = JSONObject.parseObject(extendParameter);
            if(ObjectUtils.isEmpty(extendParJson)){
                infoContentJson.put(ORGCODE, null);
                log.warn("PahpDataEncryptAndDecryptStrategy.buildCommonRequestObjMethod.平安普惠通过openApi调用morse网贷，其解密插件值未配置扩展参数，机构ID：orgCode = null");
            } else {
                infoContentJson.put(ORGCODE, extendParJson.getString(ORGCODE));
            }
            */
            jsonObject.put(PA_DATA_CONTENT_KEY, infoContentJson.toJSONString());
            log.info("PahpDataEncryptAndDecryptStrategy.buildCommonRequestObjMethod.平安惠普---构建响应数据======>结束");
            return jsonObject.toJSONString();
        } catch (Exception e) {
            log.error("PahpDataEncryptAndDecryptStrategy.buildCommonRequestObjMethod.平安惠普|数据格式错误，转换失败|解密后的数据|jsonObject:{}|异常信息：{}", jsonObject.toJSONString(), e.getMessage(), e);
            return jsonObject.toJSONString();
        }
    }
}
